# 创建名为 "add" 的共享库（动态链接库）
# SHARED 表示生成动态库（.so 文件在 Linux，.dll 在 Windows）
# add.cpp 是库的源文件
add_library(add SHARED add.cpp)

# 设置目标 "add" 的属性
set_target_properties(add PROPERTIES
    # ============================================
    # 1. 编译类参数
    # ============================================
    
    # 添加调试信息
    COMPILE_OPTIONS "-g"
    # 优化级别设置为 O3（最高级别的优化）
    COMPILE_OPTIONS "-O3"
    # 生成位置无关代码（Position Independent Code），动态库必须的
    COMPILE_OPTIONS "-fPIC"

    # 设置编译时的头文件搜索路径（仅影响当前目标的编译）
    INCLUDE_DIRECTORIES "/public"
    # 设置接口头文件搜索路径（会传递给链接此库的其他目标）
    INTERFACE_INCLUDE_DIRECTORIES "/interface"

    # ============================================
    # 2. 链接类参数
    # ============================================
    
    # 设置链接时的库搜索路径（仅影响当前目标的链接）
    LINK_DIRECTORIES "/public"
    # 设置接口库搜索路径（会传递给链接此库的其他目标）
    INTERFACE_LINK_DIRECTORIES "/interface"
    # 链接 curl 库（当前目标依赖的库）
    LINK_LIBRARIES "curl"
    # 设置接口链接库（使用此库的目标也会自动链接 jsoncpp）
    INTERFACE_LINK_LIBRARIES "jsoncpp"

    # ============================================
    # 3. 输出类参数
    # ============================================
    
    # 设置可执行文件的输出目录为构建目录下的 bin 文件夹
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    # 设置静态库的输出目录为构建目录下的 lib 文件夹
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    # 设置动态库的输出目录为构建目录下的 lib 文件夹
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"

    # ============================================
    # 4. 安装类参数
    # ============================================
    
    # 设置构建时的运行时库搜索路径
    BUILD_RPATH "${CMAKE_BINARY_DIR}/lib"
    # 设置安装后的运行时库搜索路径
    INSTALL_RPATH "lib"  # 安装后会在 lib 目录中查找依赖库
    # 设置输出文件的基本名称（不包含扩展名和版本号）
    OUTPUT_NAME "add"
    # 设置库的版本号（格式：主版本.次版本.修订版本）
    VERSION "1.2.3"
    # 设置库的 API 版本（用于符号兼容性）
    SOVERSION "20"
)